#pragma once
#include"Common.hpp"

//网络地址与主机地址之间的转换
class InetAddr
{
public:
    InetAddr(){}
    InetAddr(struct sockaddr_in &addr) :_addr(addr)
    {
        //网络转主机 net to process
        _port = ntohs(_addr.sin_port);
        char ipbuffer[1024];
        inet_ntop(AF_INET, &_addr.sin_addr, ipbuffer, sizeof(ipbuffer));
        _ip = ipbuffer;
    }
    InetAddr(const std::string ip, uint port) : _ip(ip), _port(port)
    {
        //主机转网络
        memset(&_addr, 0, sizeof(_addr));
        _addr.sin_family = AF_INET;
        _addr.sin_port = htons(_port);
        inet_pton(AF_INET, _ip.c_str(), &_addr.sin_addr);
    }

    InetAddr(uint16_t port) :_port(port),_ip()
    {
        //主机转网络
        memset(&_addr, 0, sizeof(_addr));
        _addr.sin_addr.s_addr = INADDR_ANY;
        _addr.sin_family = AF_INET;
        _addr.sin_port = htons(_port);
    }
    uint Port() {return _port;}
    std::string Ip() {return _ip;}
    const struct sockaddr_in &NetAddr() {return _addr;}
    const struct sockaddr* NetAddrPtr() {return CONV(_addr);}
    socklen_t NetAddrLen()
    {
        return sizeof(_addr);
    }
    bool operator==(const InetAddr &addr)
    {
        return addr._ip == _ip && addr._port == _port;
    }
    std::string StringAddr()
    {
        return _ip + ":" + std::to_string(_port);
    }
    ~InetAddr()
    {
    }

private:
    struct sockaddr_in _addr;
    std::string _ip;
    uint _port;
};
